package leetcode_1_20;

public class intToRoman_12 {
    /**
     * 整数转罗马数字
     * 因为罗马数字每一位数字代表符号都不同，
     * 需要确定当前数字处于第几位
     * 想法是从高位到地位遍历
     * @param num
     * @return
     */
    public static String intToRoman(int num) {
        String ans="";
        while ( num > 0){
            int x=0;
            if ( num > 99 && num < 1000) {        //三位数
                 x=num/100;
                 if(x < 4)
                     for ( ; x>0 ; x--)
                     ans += "C";
                 else if (x == 4) {
                     ans += "CD";
                 } else if (x==9) {
                     ans += "CM";
                 }else{
                     ans+="D";
                     for ( ; x>5 ; x--)
                         ans += "C";
                 }
                num -= num / 100 * 100;
            }
            else if(num > 9 && num < 100 ) {        //两位数
                x=num/10;
                if(x < 4)
                    for ( ; x>0 ; x--)
                        ans += "X";
                else if (x == 4) {
                    ans += "XL";
                } else if (x==9) {
                    ans += "XC";
                }else{
                    ans+="L";
                    for ( ; x>5 ; x--)
                        ans += "X";
                }
                num -= num / 10 * 10;
            }
            else if (num > 999 && num < 10000) { //四位数最大到3999
                x=num/1000;
                for ( ; x>0 ; x--)
                    ans += "M";
                num -= num / 1000 * 1000;
            }
            else {                      //个位数
                x=num;
                if (x < 4)
                    for (; x > 0; x--)
                        ans += "I";
                else if (x == 4) {
                    ans += "IV";
                } else if (x == 9) {
                    ans += "IX";
                } else {
                    ans += "V";
                    for (; x > 5; x--)
                        ans += "I";
                }
                break;
            }
        }
        return ans;
    }

    /**
     * 模拟解法
     * @param num
     * @return
     */
    public static String intToRoman2(int num) {
        int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        //由高到低排列特殊数值
        String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        //同理

            StringBuffer roman = new StringBuffer();
            for (int i = 0; i < values.length; ++i) {
                //遍历数值找到可以减去的最大数值
                int value = values[i];
                String symbol = symbols[i];
                while (num >= value) {     //可以减去，追加罗马字符
                    num -= value;
                    roman.append(symbol);
                }
                if (num == 0) {
                    break;
                }
            }
            return roman.toString();
        }

}

